﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing.Imaging;
using System.Web;

namespace jQuery.WebControls.ImageGallery
{
    /// <summary>
    /// Genera una salida en formato JPG de la imagen que se pasa por 
    /// QueryString "i" con el ancho especificado "w" y la altura "h"
    /// Solo admite parámetros pasados por GET
    /// <code>
    ///     http://url/ThumImageHandler.ashx?i=&w&h
    /// </code>
    /// <example>
    ///     http://url/ThumImageHandler.ashx?i=/images/inicio.jpg&w=500&h=500
    /// </example>
    /// </summary>
    public class ThumbImageHandler : IHttpHandler
    {

        #region IHttpHandler Members

        /// <summary>
        /// Procesa la petición. 
        /// </summary>
        /// <param name="context">Contexto de la aplicación</param>
        public void ProcessRequest(HttpContext context)
        {
            // Get the QueryString parameters passed
            string _imagePath = context.Request.QueryString["i"] == null ?
                string.Empty : context.Request.QueryString["i"].ToString();
            int _thumbWidth = context.Request.QueryString["w"] == null ?
                100 : int.Parse(context.Request.QueryString["w"].ToString());
            int _thumbHeight = context.Request.QueryString["h"] == null ?
                100 : int.Parse(context.Request.QueryString["h"].ToString());

            // Create a thumb image from the source image
            System.Drawing.Image _sourceImage = System.Drawing.Image.FromFile(context.Server.MapPath(_imagePath));
            System.Drawing.Image _thumbImage = this.CreateThumbnail(_sourceImage, _thumbWidth, _thumbHeight);

            // Save the thumb image to the OutputStream
            _thumbImage.Save(context.Response.OutputStream, ImageFormat.Jpeg);
        }
        /// <summary>
        /// Propiedad que indica si se puede reutilizar el manejador HTTP
        /// </summary>
        public bool IsReusable
        {
            get { return true; }
        }

        #endregion

        #region Private Methods

        /// <summary>
        /// Crea la imagen de vista previa
        /// </summary>
        /// <param name="image">Imagen a tamaño completo</param>
        /// <param name="thumbHeight">Altura de la imagen para la vista previa</param>
        /// <param name="thumbWidth">Ancho de la imagen para la vista previa</param>
        /// <returns>Devuelve la imagen con el tamaño indicado para la vista previa</returns>
        private System.Drawing.Image CreateThumbnail(System.Drawing.Image image, int thumbWidth, int thumbHeight)
        {
            return image.GetThumbnailImage(thumbWidth, thumbHeight,
                delegate() { return false; }, IntPtr.Zero);
        }

        #endregion
    }
}
